public class code1 {
//    力扣 150 删除链表的倒数第 n 个节点
public ListNode removeNthFromEnd(ListNode head, int n) {
    // 基本思路
    // 可以通过整体链表的长度 len - n 来定位到当前要删除的节点位置
    // 当然要删除这个节点，就还需要知道这个节点的前一个节点
    // 通过修改该 .next 指向来删除当前位置的参数

    // 为了避免 链表中只有一个节点带来的问题
    // 在这里歘关键一个新的节点插入到 head 节点头部
    ListNode newhead = new ListNode(-1);
    newhead.next = head;

    // 首先通过一个方法来实现对于链表长度的获取
    int len = getLength(head);

    ListNode flag = newhead;

    // 在定义一个控制正向移动的参数
    // 这里要找到 被删除节点的前一个节点
    for(int i = 1; i < len - n + 1; i++) {
        flag = flag.next;
    }

    // 之后进行移除操作
    flag.next = flag.next.next;
    return newhead.next;
}

    private int getLength(ListNode head) {
        // 定义一个返回值来记录当前链表的长度
        int re = 0;
        while(head != null) {
            re++;
            head = head.next;
        }
        return re;
    }
}
